package com.zeronx.utils;

import org.springframework.context.MessageSource;

import java.util.Locale;

/**
 * @author foreee on 2017/3/31.
 * @version 1.0
 */
public class GenericTokenParserUtil {

    private String openToken;
    private String closeToken;
    private Locale locale;
    private MessageSource messageSource;

    public GenericTokenParserUtil(String startWith, String end, Locale locale, MessageSource messageSource) {
        this.openToken = startWith;
        this.closeToken = end;
        this.locale = locale;
        this.messageSource = messageSource;
    }
    public String parse(String text) {
        final StringBuilder builder = new StringBuilder();
        final StringBuilder expression = new StringBuilder();
        if (text != null && text.length() > 0) {
            char[] src = text.toCharArray();
            int offset = 0;
            // search open token
            int start = text.indexOf(openToken, offset);
            while (start > -1) {
                if (start > 0 && src[start - 1] == '\\') {
                    // this open token is escaped. remove the backslash and continue.
                    builder.append(src, offset, start - offset - 1).append(openToken);
                    offset = start + openToken.length();
                } else {
                    // found open token. let's search close token.
                    expression.setLength(0);
                    builder.append(src, offset, start - offset);
                    offset = start + openToken.length();
                    int end = text.indexOf(closeToken, offset);
                    while (end > -1) {
                        if (end > offset && src[end - 1] == '\\') {
                            // this close token is escaped. remove the backslash and continue.
                            expression.append(src, offset, end - offset - 1).append(closeToken);
                            offset = end + closeToken.length();
                            end = text.indexOf(closeToken, offset);
                        } else {
                            expression.append(src, offset, end - offset);
                            offset = end + closeToken.length();
                            break;
                        }
                    }
                    if (end == -1) {
                        // close token was not found.
                        builder.append(src, start, src.length - start);
                        offset = src.length;
                    } else {
                        builder.append(getI18nVal(expression.toString()));
                        offset = end + closeToken.length();
                    }
                }
                start = text.indexOf(openToken, offset);
            }
            if (offset < src.length) {
                builder.append(src, offset, src.length - offset);
            }
        }
        return builder.toString();
    }

    private char[] getI18nVal(String properties) {
        String string = messageSource.getMessage(properties, null,  "", locale);
        if (string != null && !string.isEmpty()) {
            return string.toCharArray();
        }
        return properties.toCharArray();
    }
}
